import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

/// bloc框架事件监听
///
/// - [C] 要监听的Cubit类型
/// - [S] Cubit的State类型
/// - [I] State的具体实现类型，该Cubit的所有
class BlocEventListener<C extends Cubit<S>, S, I extends S>
    extends BlocListener<C, S> {
  /// 构造监听器
  /// - [listener] 监听回调实现
  /// - [key] 此监听本身是一个状态组件，用于订阅状态变化后触发回调，所以也需要key
  /// - [cubit] 要监听的Cubit实例，如果不设置，将从上下文中查找这个类型的实例
  /// - [listenWhen] 自定义条件过滤，可以自行检查前后状态决定是否触发回调
  /// - [child] 子组件，当事件发生后，这个子组件内容会更新
  BlocEventListener(
    BlocWidgetListener<I> listener, {
    super.key,
    C? cubit,
    BlocListenerCondition<S>? listenWhen,
    super.child,
  }) : super(
          listener: (c, s) {
            if (kDebugMode) {
              print("OnEventReceived :${s.runtimeType}");
            }
            listener.call(c, s as I);
          },
          bloc: cubit,
          listenWhen: (s1, s2) => s2 is I && (listenWhen?.call(s1, s2) ?? true),
        );
}
